package unmsm.fisi.tesis.dao;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

import unmsm.fisi.tesis.coneccion.ConexionWithSQL;
import unmsm.fisi.tesis.servicio.ChartParaAnalisis;
import unmsm.fisi.tesis.servicio.ResultadoDiagnosticos;
import unmsm.fisi.tesis.servicio.ResultadoPorConfiguracion;
import unmsm.fisi.tesis.si.Constantes;

public class ReportesDAO {

	public static List<ResultadoPorConfiguracion> obtenerResultadoPorConfiguracion(int idConfiguracion) {
		
		Connection cnx = ConexionWithSQL.obtenerConexion();
		
		ResultadoPorConfiguracion resultadoPorConfiguracion;
		List<ResultadoPorConfiguracion> listaResultadoPorConfiguracion = new ArrayList<ResultadoPorConfiguracion>();
		
		
			try
			{
				
				CallableStatement cstmt = cnx.prepareCall("{call dbo.sp_obtenerResumenDeAlgoritmoGenetico( ? )}");
			    cstmt.setInt("CODIGOCONFIGURACION", idConfiguracion);//HOLA
			     
			    ResultSet rs =  cstmt.executeQuery();
			     
			     
				while(rs.next())
				{
					resultadoPorConfiguracion = new ResultadoPorConfiguracion();
					resultadoPorConfiguracion.setCodigoconfiguracion(rs.getInt("CODIGOCONFIGURACION"));
					resultadoPorConfiguracion.setNumeroGeneracion(rs.getInt("NUMEROGENERACIONACONSIDERAR"));
					resultadoPorConfiguracion.setNumeroPacientes(rs.getInt("NUMEROPACIENTESACONSIDERAR"));
					resultadoPorConfiguracion.setNumeroPoblacion(rs.getInt("NUMEROPOBLACIONACONSIDERAR"));
					resultadoPorConfiguracion.setNumeroReglas(rs.getInt("NUMEROREGLASACONSIDERAR"));
					resultadoPorConfiguracion.setProbabilidadCrossover(rs.getDouble("PROBABIBLIDADCROSSOVER"));
					resultadoPorConfiguracion.setProbabilidadMutacion(rs.getDouble("PROBABILIDADMUTACION"));
					resultadoPorConfiguracion.setValorAdaptacion(rs.getDouble("VALORADAPTACION"));
					resultadoPorConfiguracion.setGeneracionNacimiento(rs.getInt("GENERACIONACIMIENTO"));
					resultadoPorConfiguracion.setCondicionParada(rs.getString("CONDICIONPARADA"));
					resultadoPorConfiguracion.setDatoParada(rs.getInt("DATOPARADA"));
					
					
					listaResultadoPorConfiguracion.add(resultadoPorConfiguracion);
				}
				rs.close();
				cstmt.close();
			
				
			}
			catch(Exception e)
			{
				e.printStackTrace();
				System.out.print(e.getMessage());
				
			}finally {
				 if (cnx != null) try { cnx.close(); } catch(Exception e) {e.printStackTrace();}
	        }
			
		return listaResultadoPorConfiguracion;
	}
	
	public static List<ResultadoDiagnosticos> obtenerPacientesValidacion() {
		
		Connection cnx = ConexionWithSQL.obtenerConexionParaHistoriaClinica();
		
		ResultadoDiagnosticos resultadoDiagnosticos;
		List<ResultadoDiagnosticos> listaResultadoDiagnosticos = new ArrayList<ResultadoDiagnosticos>();
		
			try
			{
				
				CallableStatement cstmt = cnx.prepareCall("{call dbo.sp_obtenerPacientesValidacion( )}");
			     
			    ResultSet rs =  cstmt.executeQuery();
			     
				while(rs.next())
				{
					resultadoDiagnosticos = new ResultadoDiagnosticos();
					resultadoDiagnosticos.setCorrelativo(rs.getInt("ID")); 
					resultadoDiagnosticos.setHospital(rs.getString("DESCRIPCION"));
					resultadoDiagnosticos.setNumeroHistoriaClinica(rs.getString("NUMEROHISTORIA"));
					resultadoDiagnosticos.setNombreCompletoPaciente(rs.getString("NOMBRES"));
					resultadoDiagnosticos.setS_diag_sistema(rs.getString("RESULTADO").trim().equals("1")?"SI":"NO");
					resultadoDiagnosticos.setS_diag_medico(rs.getString("SINDROMEMETABOLICO").trim().equals("1")?"SI":"NO");
					resultadoDiagnosticos.setAserto(resultadoDiagnosticos.getS_diag_sistema().trim().equals(resultadoDiagnosticos.getS_diag_medico())?"si":"no");
					resultadoDiagnosticos.setS_diag_medico2(rs.getString("SINDROMEMETABOLICO2").trim().equals("1")?"SI":"NO");
					resultadoDiagnosticos.setAserto2(resultadoDiagnosticos.getS_diag_sistema().trim().equals(resultadoDiagnosticos.getS_diag_medico2())?"si":"no");
					
					listaResultadoDiagnosticos.add(resultadoDiagnosticos);
				}
				rs.close();
				cstmt.close();
			
				
			}
			catch(Exception e)
			{
				e.printStackTrace();
				System.out.print(e.getMessage());
				
			}finally {
				 if (cnx != null) try { cnx.close(); } catch(Exception e) {e.printStackTrace();}
	        }
			
		return listaResultadoDiagnosticos;
	}

	
	public static List<ChartParaAnalisis> obtenerChartParaPacientes() {
		return obtenerChartParaAnalisis("sp_obtenerCantidadPacientesParaChart",Constantes.coneccionHistorias);
	}
	
	public static List<ChartParaAnalisis> obtenerChartPacientePorEstablecimientoSalud() {
		return obtenerChartParaAnalisis("sp_obtenerCantidadPacientesPorEstablecimientoSaludChart",Constantes.coneccionHistorias);
	}
	
	public static List<ChartParaAnalisis> obtenerChartCantidadEdadPacientes() {
		return obtenerChartParaAnalisis("sp_obtenerCantidadEdadPacientesChart",Constantes.coneccionHistorias);
	}
	public static List<ChartParaAnalisis> obtenerChartCantidadPacientesPorSexo() {
		return obtenerChartParaAnalisis("sp_obtenerCantidadPacientesPorSexoChart",Constantes.coneccionHistorias);
	}
	public static List<ChartParaAnalisis> obtenerChartCantidadPacientesConSMEnPruebasPorSexo() {
		return obtenerChartParaAnalisis("sp_obtenerCantidadPacientesConSMEnPruebasChart",Constantes.coneccionHistorias);
	}
	public static List<ChartParaAnalisis> obtenerChartCantidadPacientesConSMEnEntrenamiento() {
		return obtenerChartParaAnalisis("sp_obtenerCantidadPacientesConSMEnEntrenamientoChart",Constantes.coneccionHistorias);
	}
	
	public static List<ChartParaAnalisis> obtenerChartEstadoAlgoritmo() {
		return obtenerChartParaAnalisis("sp_obtenerEstadoGeneracion",Constantes.coneccionAlgoritmo);
	}
	
	public static List<ChartParaAnalisis> obtenerChartEstadoAlgoritmoConFitnes() {
		return obtenerChartParaAnalisis("sp_obtenerEstadoGeneracionConFitnes",Constantes.coneccionAlgoritmo);
	}
	
	
	
	public static List<ChartParaAnalisis> obtenerChartParaAnalisis(String nombreProcedure, String coneccion) {
		
		Connection cnx;
		if(coneccion.equals(Constantes.coneccionHistorias))
			cnx = ConexionWithSQL.obtenerConexionParaHistoriaClinica();
		else
			cnx = ConexionWithSQL.obtenerConexion();
		
		ChartParaAnalisis chartParaAnalisis;
		List<ChartParaAnalisis> lista= new ArrayList<ChartParaAnalisis>();
		
			try
			{
				
				CallableStatement cstmt = cnx.prepareCall("{call dbo."+nombreProcedure+"( )}");
			     

					ResultSet rs =  cstmt.executeQuery();
				     
					while(rs.next())
					{
						chartParaAnalisis = new ChartParaAnalisis();
						chartParaAnalisis.setCantidad(rs.getInt("CANTIDAD")); 
						chartParaAnalisis.setDescripcion(rs.getString("DESCRIPCION"));
						
						lista.add(chartParaAnalisis);
					}
					rs.close();
					cstmt.close();
			
				
			}
			catch(Exception e)
			{
				e.printStackTrace();
				System.out.print(e.getMessage());
				
			}finally {
				 if (cnx != null) try { cnx.close(); } catch(Exception e) {e.printStackTrace();}
	        }
			
		return lista;
	}

	

	public static List<ChartParaAnalisis> obtenerMultiplesConsultasEnUnProcedure(String nombreProcedure) {
		
		Connection cnx = ConexionWithSQL.obtenerConexionParaHistoriaClinica();
		
		ChartParaAnalisis chartParaAnalisis;
		List<ChartParaAnalisis> lista= new ArrayList<ChartParaAnalisis>();
		
			try
			{
				
				CallableStatement cstmt = cnx.prepareCall("{call dbo."+nombreProcedure+"( )}");
			     
				boolean results = cstmt.execute();

				while (results) {
					ResultSet rs =  cstmt.getResultSet();
				     
					while(rs.next())
					{
						chartParaAnalisis = new ChartParaAnalisis();
						chartParaAnalisis.setCantidad(rs.getInt("CANTIDAD")); 
						chartParaAnalisis.setDescripcion(rs.getString("DESCRIPCION"));
						
						lista.add(chartParaAnalisis);
					}
					rs.close();
					results = cstmt.getMoreResults();
				}
				cstmt.close();
			
				
			}
			catch(Exception e)
			{
				e.printStackTrace();
				System.out.print(e.getMessage());
				
			}finally {
				 if (cnx != null) try { cnx.close(); } catch(Exception e) {e.printStackTrace();}
	        }
			
		return lista;
	}

	
	
}
